#!/usr/bin/env python
# -*- coding: utf-8 -*-
#-------------------------------------------------------------------------------
# Name:        dictparser.py
# Purpose:     Class for parsing source text of Esperanto-Russian dictionary
#
# Author:      Yegor Chemisov
#
# Created:     28.04.2011
# Copyright:   (c) Yegor Chemisov 2011
# Licence:     <your licence>
#-------------------------------------------------------------------------------

import re
import textparser
from string import Template

TILDE           = '~'
COMMA           = ','
VERTICAL_BAR    = '|'
FORWARD_SLASH   = '/'
DOUBLE_BAR      = '||'

PARENTHESES     = re.compile(r'\(([^)]*)\)') # Содержимое скобок: alef(o) -> o
CUT_ROOT        = re.compile(r'(.*?)[| ].*') # Получение базовой части слова

class DictionaryParser:
    """Формирование словарной статьи согласно шаблону и построение индексов."""

    def __init__(self):
        # корень/корни слова для подстановки в слова с тильдой
        self.roots = []
        # Шаблоны для создания индексов. Задаются в конфигурационном файле.
        self.templates = {}

    def getIndex(self, word):
        """Индексы для слова"""
        if COMMA in word: return ''.join(
            [self.getIndex(w) for w in word.split(COMMA)])
        if TILDE in word: return ''.join(
            [self.getIndex(word.replace(TILDE, root)) for root in self.roots])
        if PARENTHESES.search(word): return ''.join(
            [self.getIndex(PARENTHESES.sub(r'', word, 1)),
             self.getIndex(PARENTHESES.sub(r'\1', word, 1))])
        # Чистим слово от лишних символов
        word = re.sub(r'[|/]| I{1,3}', '', word).strip()
        # Склоняем, если склоняемо
        inflections = self.templates[word[-1]].format(word[:-1]) \
            if word[0] != '-' and len(word) > 1 and word[-1] in 'aijo' else ''
        return self.templates['orth'].format(word, inflections)

    def formatWord(self, match):
        """Формирование словарной статьи согласно шаблону и построение индексов.
        """
        word        = match.group(1)
        definition  = match.group(2)
        if TILDE not in word:
            self.roots = [CUT_ROOT.sub(r'\1', w.strip()) \
                            for w in word.split(COMMA)]
        index   = self.getIndex(word)
        word    = word.replace(FORWARD_SLASH,'·'
                            ).replace(VERTICAL_BAR,DOUBLE_BAR)
        return self.templates['entry'].format(index, word, definition)

def main():
    bk = DictionaryParser()
    parser = textparser.TextParser('eoru2mobi.ini')
    bk.templates = parser.config['Templates']
    parser.carryOut('Articles')
    parser.carryOut('Dictionary', {'formatword': bk.formatWord})

if __name__ == '__main__':
    main()
